home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / crt / sun4.md / setjmp.s < prev    next >
Text File  |  1989-11-22  |  3KB  |  132 lines

  1. /* 
  2.  * setjmp.s --
  3.  *
  4.  *    setjmp/longjmp routines for SUN4.
  5.  *
  6.  * Copyright 1988 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  *
  15.  * static char rcsid[] = "$Header: machCCRegs.s,v 1.1 88/06/15 14:18:30 mendel E
  16. xp $ SPRITE (Berkeley)";
  17.  *
  18.  */
  19.  
  20.  /*
  21.   * Define offsets in the jmp_buf block.
  22.   */
  23.  
  24. #define    SIGMASK_OFFSET    0
  25. #define    RTNPC_OFFSET    4
  26. #define    SP_OFFSET    8
  27. /* 
  28.  *----------------------------------------------------------------------
  29.  *
  30.  * setjmp/_setjmp --
  31.  *
  32.  *    setjmp and _setjmp routines for SUN4.
  33.  *
  34.  * Results:
  35.  *    An integer 0.
  36.  *
  37.  * Side effects:
  38.  *    None.
  39.  *
  40.  * Calling Sequence:
  41.  *    int val = setjmp(env) or val = _setjmp(env)
  42.  *    jmp_buf        env;
  43.  *
  44.  *----------------------------------------------------------------------
  45.  * 
  46.  */
  47.  
  48. .text
  49.     .align 2
  50. .globl _setjmp
  51. .globl    __setjmp
  52. _setjmp:
  53.     save %sp, -104, %sp
  54.     /*
  55.      * First call sigblock(0) to get the current signal mask and 
  56.      * save it in the jmp_env block.
  57.      */
  58.     call     _sigblock,1
  59.     mov    0,%o0
  60.     mov    %o0,%g1
  61.     restore
  62.     st      %g1, [%o0 + SIGMASK_OFFSET]
  63.     /*
  64.      * _setjmp doesn't need the sigmask so it can start here.
  65.      */
  66. __setjmp:
  67.     /*
  68.      * Save our save pointer and return address in the jmp_buf for
  69.      * use by longjmp.
  70.      */
  71.     st      %sp, [%o0 + SP_OFFSET]
  72.     st      %o7, [%o0 + RTNPC_OFFSET]
  73.     /*
  74.      * Return a 0 like a good setjmp should. 
  75.      */
  76.     retl
  77.     mov    0,%o0
  78. /* 
  79.  *----------------------------------------------------------------------
  80.  *
  81.  * longjmp/_longjmp --
  82.  *
  83.  *    longjmp and _longjmp routines for SUN4.
  84.  *
  85.  * Results:
  86.  *    Doesn't return normally.
  87.  *
  88.  * Side effects:
  89.  *    Returns to the specified setjmp/_setjmp call.
  90.  *     longjmp restores the signal mask.
  91.  *
  92.  * Calling Sequence:
  93.  *    longjmp(env,val) or  _setjmp(env,val)
  94.  *    jmp_buf        env;
  95.  *    int    val;
  96.  *
  97.  *----------------------------------------------------------------------
  98.  * 
  99.  */
  100.  
  101.  
  102.  
  103.     .align 2
  104. .globl _longjmp
  105. .globl    __longjmp
  106. _longjmp:
  107.         save    %sp,-96,%sp
  108.     /*
  109.      * Restore the signal mask to the saved value.
  110.      */
  111.     call     _sigsetmask,1
  112.         ld      [%i0+SIGMASK_OFFSET],%o0
  113.     restore
  114.     /*
  115.      * _longjump doesn't restore the sigmask so it can start here.
  116.      */
  117. __longjmp:
  118.     /*
  119.      * Write out the register windows to memory.
  120.      */
  121.     ta    5
  122.     /*
  123.      * Fake togther a call frame that can "return" in to the
  124.      * setjmp call.
  125.      */
  126.     ld    [%o0 + SP_OFFSET], %fp
  127.     sub     %fp, 64, %sp
  128.     ld    [%o0 + RTNPC_OFFSET], %o7
  129.     mov     %o1,%i0
  130.     retl
  131.     restore
  132.